﻿using System;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Microsoft.Ink;
using ICSharpCode.SharpZipLib.Zip;
using Modele;
using System.IO;
using System.Drawing;


namespace Sauvegarde
{

    /**
    * @author PAN
    * @date Juin 2010
    * @brief La classe reader1 permet l'ouverture des fichiers de sauvegarde d'un projet PAN
    */
    class reader1
    {
        //attribut
        Modele.Modele m;


        /** 
         * reader1(Modele.Modele mod)
         * 
         * @brief : Constructeur
         * @param : Modele.Modele mod le modele avec lequel on instancie le paramètre m de la classe reader1
         */
        public reader1(Modele.Modele mod)
        {
            m = mod;
        }

        /** 
         * lireDansPan(string zipFilename, string extractDir)
         * 
         * @brief : permet de dézipper une archive
         * @param : string zipFilename l'url du fichier zip
         * @param : string extractDir l'adresse sur le disque
         * @return void
         */
        static void lireDansPan(string zipFilename, string extractDir)
        {
            ZipInputStream zis = null;
            FileStream fos = null;
            try
            {
                zis = new ZipInputStream(new FileStream(zipFilename, FileMode.Open, FileAccess.Read));
                ZipEntry ze;
                // on dezippe tout dans un rep du nom du zip, pas en bordel
                Directory.CreateDirectory(extractDir);
                while ((ze = zis.GetNextEntry()) != null)
                {
                    if (ze.IsDirectory)
                    {
                        Directory.CreateDirectory(extractDir + "\\" + ze.Name);
                    }
                    else
                    {
                        if (!Directory.Exists(extractDir + "\\" + Path.GetDirectoryName(ze.Name)))
                        {
                            Directory.CreateDirectory(extractDir + "\\" + Path.GetDirectoryName(ze.Name));
                        }
                        fos = new FileStream(extractDir + "\\" + ze.Name, FileMode.Create, FileAccess.Write);
                        int count;
                        byte[] buffer = new byte[4096];
                        while ((count = zis.Read(buffer, 0, 4096)) > 0)
                        {
                            fos.Write(buffer, 0, count);
                        }
                    }
                }
            }
            finally
            {
               if (zis != null) zis.Close();
               if (fos != null) fos.Close();
            }
        }

        /** 
         * lireUPX(String cheminAbs)
         * 
         * @brief : permet de lire le fichier UPX et de remplir la strcture de données du projet
         * @param : string cheminAbs le chemin absolu du fichier UPX (chemin + nom du fichier + extension)
         * @return : Bitmap l'image de fond 
         */
        public Bitmap lireUPX(String cheminAbs)
        {
            Bitmap res = new Bitmap(global::projet_PAN.Properties.Resources.image_fond_defaut);

            String chemin = ManipulationChaine.extension(cheminAbs);
            String nomFichier = ManipulationChaine.fichierPan(cheminAbs);
            //String nouvDossier = ""+chemin +"\\"+ ManipulationChaine.nomFichier(cheminAbs);


            //lireDansPan("" + chemin + "\\" + nomFichier, nouvDossier);

            //ProjetBlocNote nouvProjet = new ProjetBlocNote();

                        // Create an isntance of XmlTextReader and call Read method to read the file

                        //XmlTextReader textReader = new XmlTextReader("" + nouvDossier + "\\sauvegarde.upx");

            XmlTextReader textReader = new XmlTextReader(cheminAbs);            

                        textReader.Read();

                        // Move to first element
                        textReader.MoveToElement();



                        int indiceCalqueCourant = 0; //le numéro du calque courant

                        //a revoir il faut partir de 0, la couche 0 correspond au document (type Page)
                        int indiceCoucheCourante = 1; // le numéro de la couche courante

                        int nbPages = 1;
                        int nbPassage = nbPages;



                        // If the node has value

                        while (textReader.Read())
                        {

                            //String url_img = "";


                            // nom du noeud
                            string name = textReader.Name; //nom du noeud courant
                            
                            if (name.Equals("image")) 
                            {
                                textReader.MoveToAttribute("url_image");
                                //String url_image = nouvDossier+"\\"+textReader.Value;
                                String url_image = chemin + "\\" + textReader.Value;

                                if (textReader.Value != "")
                                {
                                    try
                                    {
                                         Bitmap imageFond = new Bitmap(url_image);
                                         res = imageFond;
                                         m.getProjet().ajouterDocument(imageFond);
                                    }
                                    catch (System.OutOfMemoryException e)
                                    {
                                        Console.WriteLine("problème avec l'image");
                                        Console.WriteLine(e.StackTrace);
                                        Console.ReadLine();
                                    }
                                }

                                textReader.MoveToElement();
                            }

                            //ouverture de la liste des auteurs
                            if (name.Equals("auteursProjet"))
                            {
                                if (textReader.HasAttributes)
                                {
                                    for (int aut = 0; aut < textReader.AttributeCount; aut++)
                                    {
                                        textReader.MoveToAttribute(aut);
                                        m.getProjet().setAuthor(textReader.Value);
                                        Console.WriteLine("Ajout de {0}",textReader.Value);
                                    }
                                    textReader.MoveToElement();
                                }
                            }


                            //ouverture de la liste des mots-clés
                            if (name.Equals("mots_cles"))
                            {
                                if (textReader.HasAttributes)
                                {
                                    for (int mo = 0; mo < textReader.AttributeCount; mo++)
                                    {
                                        textReader.MoveToAttribute(mo);
                                        m.getProjet().setKeyWord(textReader.Value);
                                        Console.WriteLine("Ajout de {0}", textReader.Value);
                                    }
                                    textReader.MoveToElement();
                                }
                            }

                            //ouverture de la liste d'images
                            if (name.Equals("bibliothèqueImages"))
                            {
                                if (textReader.HasAttributes)
                                {
                                    for (int im = 0; im < textReader.AttributeCount; im++)
                                    {
                                        textReader.MoveToAttribute(im);
                                        String nomIm = chemin +"\\"+textReader.Value;
                                        Bitmap imageBalise = new Bitmap(nomIm);
                                        m.getProjet().setBibImages(imageBalise);
                                    }
                                    textReader.MoveToElement();
                                }
                            }

                            //ouverture de la liste de balises
                            if (name.Equals("bibliothèqueBalises"))
                            {
                                
                                if (textReader.HasAttributes)
                                {
                                    String sig;
                                    String preAut;
                                    String nomAut;

                                    textReader.MoveToAttribute("nombre");
                                    int nombre = Convert.ToInt32(textReader.Value);
                                    int n = 0;
                                    textReader.MoveToElement();


                                    while (nombre != 0)
                                    {
                                        textReader.Read();
                                        name = textReader.Name;
                                        if (name.Equals("bal" + n))
                                        {
                                            textReader.MoveToAttribute("url_balise");
                                            String urlBal = chemin + "\\" + textReader.Value;
                                            textReader.MoveToElement();
                                            textReader.MoveToAttribute("signification");
                                            sig = textReader.Value;
                                            textReader.MoveToElement();
                                            textReader.MoveToAttribute("prenom");
                                            preAut = textReader.Value;
                                            textReader.MoveToElement();
                                            textReader.MoveToAttribute("nom");
                                            nomAut = textReader.Value;
                                            textReader.MoveToElement();
                                            Bitmap icBal = new Bitmap(urlBal);
                                            Semantique se = new Semantique(sig, preAut, nomAut);
                                            Balise ajout = new Balise(se, icBal);
                                            m.getProjet().setBibBalises(ajout);
                                            nombre--;
                                            n++;
                                        }
                                    }
                                }
                            }

                            if (name.Equals("nbPages")) // le nombre de pages du projet
                            {

                                textReader.MoveToAttribute("nb");
                                nbPages = Convert.ToInt32(textReader.Value);
                                textReader.MoveToElement();
                                m.getProjet().setNbPages(nbPages);
                            }

                            if (name.Equals("hlevel"))
                            {
                                        textReader.MoveToAttribute("level");
                                        String nom_attribut = textReader.Value;

                                        if (nom_attribut.Equals("couche"))
                                        {
                                            nbPassage = nbPages;

                                            textReader.MoveToAttribute("idcouche");
                                            //int num_couche = Convert.ToInt32(textReader.Value);
                                            indiceCoucheCourante = Convert.ToInt32(textReader.Value);
                                            textReader.MoveToElement();

                                            textReader.MoveToAttribute("visible");
                                            string visib = textReader.Value;
                                            textReader.MoveToElement();
                                            if (visib.Equals("non"))//visibilité à vrai par défaut donc traitement que si non visible
                                            {
                                                m.getProjet().accesCoucheInd(indiceCoucheCourante).changerVisibilite();
                                            }
                                            /*
                                            textReader.MoveToAttribute("nom_couche");
                                            String nomc = textReader.Value;
                                            textReader.MoveToElement();

                                            m.getProjet().accesCoucheInd(indiceCoucheCourante).setNom(nomc);
                                            */

                                            indiceCalqueCourant = 0;
                                        }

                                            if (nom_attribut.Equals("calque"))
                                            {
                                                if (indiceCoucheCourante >1)
                                                {
                                                    m.getProjet().ajouterCalque();
                                                }

                                                ProjetBlocNote df = m.getProjet();

                                                textReader.MoveToAttribute("idcalque");
                                                int num_calque = Convert.ToInt32(textReader.Value);

                                                textReader.MoveToAttribute("url_calque");
                                                //String url_calque = nouvDossier +"\\"+ textReader.Value;
                                                String url_calque = chemin + "\\" + textReader.Value;
                                                EnregistrementPAN enre = new EnregistrementPAN();
                                                ((Calque)m.getProjet().accesCoucheInd(indiceCoucheCourante).couche[indiceCalqueCourant]).encre
                                                        = enre.Ouverture(url_calque);

                                                 textReader.MoveToElement();
                                                 nbPassage--;
                                                 if (nbPassage < 0)
                                                 {
                                                     indiceCalqueCourant++;
                                                 }

                                            }

                                        if (nom_attribut.Equals("balise"))
                                        {
                                            name = textReader.Name;

                                            textReader.MoveToAttribute("url_icone_balise");
                                            //String url_icone_balise = "" + nouvDossier +"\\"+ textReader.Value;
                                            String url_icone_balise = chemin + "\\" + textReader.Value;
                                            textReader.MoveToElement();

                                            textReader.Read();
                                            name = textReader.Name;

                                            int x = 0;
                                            int y = 0;

                                            if (name.Equals("position"))
                                            {
                                                textReader.MoveToAttribute("positionX");
                                                x = Convert.ToInt32(textReader.Value);
                                                textReader.MoveToElement();
                                                textReader.MoveToAttribute("positionY");
                                                y = Convert.ToInt32(textReader.Value);
                                                textReader.MoveToElement();
                                            }

                                            textReader.Read();//noeud auteur
                                            name = textReader.Name;
                                            string prenom = "";
                                            string nom = "";
                                            if (name.Equals("auteur"))
                                            {
                                                textReader.MoveToAttribute("prenom");
                                                prenom = textReader.Value;
                                                textReader.MoveToElement();
                                                textReader.MoveToAttribute("nom");
                                                nom = textReader.Value;
                                                textReader.MoveToElement();
                                            }

                                            textReader.Read(); //noeud label
                                            name = textReader.Name;
                                            if (name.Equals("label"))
                                            {
                                                textReader.Read(); // noeud alternate
                                                name = textReader.Name;

                                                string sem = "";
                                                if (name.Equals("alternate"))
                                                {
                                                    sem = textReader.ReadString();
                                                }


                                                Position p = new Position(x, y);
                                                Semantique semt = new Semantique(sem,prenom,nom);
                                                //AnnotationPAN ann = new AnnotationPAN(p, s);
                                                Balise bal = new Balise(p, semt, url_icone_balise);

                                                ((Calque)m.getProjet().accesCoucheInd(indiceCoucheCourante).couche[indiceCalqueCourant]).add(bal);
                                            }
                                        }

                                        if (nom_attribut.Equals("texte"))
                                        {
                                            name = textReader.Name;

                                            textReader.MoveToAttribute("att_texte");
                                            String tex = textReader.Value;
                                            textReader.MoveToElement();

                                            textReader.Read();
                                            name = textReader.Name;

                                            float taillep = 16;
                                            string nomp = "arial";

                                            if (name.Equals("police_texte"))
                                            {
                                                textReader.MoveToAttribute("police");
                                                nomp = textReader.Value;
                                                textReader.MoveToAttribute("taille");
                                                taillep = float.Parse(textReader.Value);
                                            }

                                            textReader.Read();
                                            name = textReader.Name;

                                            int x = 0;
                                            int y = 0;

                                            if (name.Equals("position"))
                                            {
                                                textReader.MoveToAttribute("positionX");
                                                x = Convert.ToInt32(textReader.Value);
                                                textReader.MoveToElement();
                                                textReader.MoveToAttribute("positionY");
                                                y = Convert.ToInt32(textReader.Value);
                                                textReader.MoveToElement();
                                            }

                                            /*
                                            textReader.Read();//noeud auteur
                                            name = textReader.Name;
                                            string prenom = "";
                                            string nom = "";
                                            if (name.Equals("auteur"))
                                            {
                                                textReader.MoveToAttribute("prenom");
                                                prenom = textReader.Value;
                                                textReader.MoveToElement();
                                                textReader.MoveToAttribute("nom");
                                                nom = textReader.Value;
                                                textReader.MoveToElement();
                                            }

                                            textReader.Read(); //noeud label
                                            name = textReader.Name;
                                            if (name.Equals("label"))
                                            {
                                                textReader.Read(); // noeud alternate
                                                name = textReader.Name;

                                                string sem = "";
                                                if (name.Equals("alternate"))
                                                {
                                                    sem = textReader.Value.ToString();
                                                }
                                             }
                                            */

                                                Position p = new Position(x, y);
                                                //Semantique semt = new Semantique(sem,prenom,nom);
                                                //AnnotationPAN ann = new AnnotationPAN(p, s);
                                                //Texte text1 = new Texte(p, semt, tex);
                                                Font f = new Font(nomp, taillep);
                                                Texte text1 = new Texte(p,tex,f);
                                                ((Calque)m.getProjet().accesCoucheInd(indiceCoucheCourante).couche[indiceCalqueCourant]).add(text1);
                                        }//fermeture du if sur texte

                                        textReader.MoveToElement();
                                }//fermeture du if sur hlevel
                            }//fermeture du while read
                        textReader.Close();

                        //System.IO.Directory.Delete(nouvDossier,true);


                        return res;
                        }//fermeture de la fonction
                    }
                }//fin reader sur l'archive


                    //consignes générales pour écrire des xml (à supprimer une fois fini)

                    // si nombre d'attribut dans le noeud différent de 0

                    /*   if (textReader.HasAttributes)
                       {
                           for (int i = 0; i < textReader.AttributeCount; i++)
                           {
                               textReader.MoveToAttribute(i);
                               Console.WriteLine(" " + textReader.Name + "=" + textReader.Value.ToString());
                           }
                           textReader.MoveToElement(); // Moves the reader back to the element node.
                       }


                       Console.WriteLine("Value:" + textReader.Value.ToString()); //valeur entre balise ouvrante et fermante

                       //accès à un attribut particulier d'un noeud
                       if (textReader.HasAttributes)
                       {
                           Console.WriteLine("Attribute id of <" + textReader.Name + ">");
                           textReader.MoveToAttribute("id");
                           Console.WriteLine("id:" + textReader.Value.ToString());
                           textReader.MoveToElement();
                       }

                       //parcours de tous les attributs du noeud
                       if (textReader.HasAttributes)
                       {
                           Console.WriteLine("Attributes of <" + textReader.Name + ">");
                           for (int i = 0; i < textReader.AttributeCount; i++)
                           {
                               textReader.MoveToAttribute(i);
                               Console.WriteLine(" " + textReader.Name + "=" + textReader.Value.ToString());
                           }
                           textReader.MoveToElement(); // Moves the reader back to the element node.
                       }
                   }
                   Console.ReadLine();
               }*/
